#include <bits/stdc++.h>
using namespace std;
/*
#此处代码不通过，auto不能作为形参类型，因为编译器无法对a的实际类型进行自动推导
void TestAuto(auto a)
{
    ;
}

void TestAuto()
{
    int a[] = { 1, 2, 3 };
    auto b[3] = a;//auto类型不能出现在顶级数组类型中

*/
int main()
{
    int a = 10;
    auto b = a; // b的类型是int
    // auto e; 使用auto时必须要对其进行初始化
    auto a = 1, b = 2; //在同一行定义多个变量时，这些变量必须是相同的类型

    //案例一
    int array2[] = {1, 2, 3, 4, 5};
    for (auto e : array2) //依次取array里面的元素读给e
        cout << e << endl;

    //案例二
    int array1[] = {1, 2, 3, 4, 5};
    for (auto &e : array1) //遍历数组，给数组的每个对象*2；
        e = e * 2;

    for (auto &e : array1) //遍历数组，依次取出数组里面的元素，赋给e
        cout << e << " ";

    /*
        分析：不加“&”的意思是取出array里面的每个对象，赋给e，e虽然被改变了，但数组里面的对象并没有变；
        加“&”表示e是数组里面 每个对象的别名，此时e一改变，数组里面的每个对象也会改变，因为e是每个对象的别名。

        注意:与普通循环类似，可以用continue来结束本次循环， 也可以用break来跳出整个循环。
    */

    /*
        for循环迭代的范围必须是确定的，对于数组而言,就是数组中第一个元素和最后一个元素的范围；
        对于类而言,应该提供begin和end的方法，begin和end就是for循环迭代的范围，以下代码就有问题：

    void Test(int array[])
    {
        for (auto& e : array)
            cout << e <<endl;
    }
    分析：这个代码编译不通过，此时的array不再是数组而是一个指针，for的范围不确定。

    */
}